/**
 *
 *  @function   每个消息由6个字节的文件头和值组成，这里定义文件头的各种消息类型
 *  @example    比如我要发送一个1.jpg的图片文件，那需要先发送一个e_msgSendFile类型的文件头+文件名，
 *              再发送多个e_msgFileContent类型的文件头+文件内容直到文件尾
 *              最后发送e_msgEndFile类型的文件头，以通知对端文件发送完成
 *
 */
#ifndef __HZQ_FORMAT_H
#define __HZQ_FORMAT_H


#pragma pack(4)
struct MsgLen{
    unsigned int m_msgTypeLen;
    unsigned int m_msgValueLen;
    unsigned int m_msgLen;          //总长度
};
extern struct MsgLen Msg;

/**
 * 格式说明：文件头使用最常见的TLV格式数据，即数据类型(type)+数据长度(length)+数据内容(value)
 *          T:2个字节，L:4字节，V:根据L而定
 */
enum MessageType{
    e_msgDebug,             //debug阶段用的一个消息类型
    e_msgGet,               //文件请求命令
    e_msgFileHead,          //文件头信息
    e_msgSendFile,          //文件上传请求
    e_msgfileOk,            //文件可以上传
    e_msgFileContent,       //文件内容
    e_msgEndFile,           //文件传输完成 
    e_msgFileLegal,         //文件名合法，可以上传文件
    e_msgFileNonExist,      //文件不存在
}messageType;

/** 
 * @brief  打包文件头，即以小端方式将消息类型，消息长度写入到字符串
 * @note   
 * @param  cmd:         消息类型
 * @param  packet_len:  消息长度(不包括6字节的文件头)
 * @param  *buf:        要写入的字符串
 * @retval none
 */
void  package_head(unsigned char *send_cmd,unsigned short cmd_num,unsigned int packet_len);


/** 
 * @brief  解析6字节文件头，即读出以小端方式写入消息类型，消息长度
 * @note   
 * @param  cmd:         消息类型
 * @param  packet_len:  消息长度(不包括6字节的文件头)
 * @param  *buf:        要解析的字符串
 * @retval none
 */
void head_analyze(char *p,unsigned short *cmd_num,unsigned int *packet_len);

#endif  //!__HZQ_FORMAT_H